<?php
/**
 * Created by PhpStorm.
 * User: Zhoujinda
 * Date: 2016/3/28
 * Time: 15:06
 */

namespace Api\Controller;

use Common\Api\PayOrderApi;
use Shop\Api\AlipayNotifyApi;
use Common\Api\ExchangeLogApi;

class AlipayAppController extends AlipayController{

    private $alipay_config;

    /**
     * 构造函数
     */
    public function __construct(){
        parent::__construct();
        //引入支付官方sdk
        vendor('alipay_notify',APP_PATH.'Api/Vendor/AlipayApp/lib','.class.php');
        $this->alipay_config = $this->getAlipayAppConfig();

    }

    public function return_url(){

        //addLog('AlipayApp/return_url',$_GET,$_POST,'支付宝return_url',true);
        $alipayNotify = new \AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号

            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号

            $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];

            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
                $this->log();
                $this->paySuccess($out_trade_no);
            }
            else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //付款完成后，支付宝系统发送该交易状态通知
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
                $this->log();
                $this->paySuccess($out_trade_no);
            }

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            echo "success";		//请不要修改或删除

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            echo "fail";

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
        }
    }


    private function paySuccess($out_trade_no){

        $prex = substr($out_trade_no,0,1);
        if($prex == 'T'){
            apiCall(PayOrderApi::SUCCESS,array($out_trade_no,1));
        }elseif($prex=='S'){
            apiCall(ExchangeLogApi::PAYBACK,array($out_trade_no));
        }

    }

    private function log(){

        $entity = array(
            'payment_type' => $_POST['payment_type'],
            'subject' => $_POST['subject'],
            'trade_no' => $_POST['trade_no'],
            'buyer_email' => $_POST['buyer_email'],
            'gmt_create' => $_POST['gmt_create'],
            'notify_type' => $_POST['notify_type'],
            'quantity' => $_POST['quantity'],
            'out_trade_no' => $_POST['out_trade_no'],
            'seller_id' => $_POST['seller_id'],
            'notify_time' => $_POST['notify_time'],
            'body' => $_POST['body'],
            'trade_status' => $_POST['trade_status'],
            'is_total_fee_adjust' => $_POST['is_total_fee_adjust'],
            'total_fee' => $_POST['total_fee'],
            'seller_email' => $_POST['seller_email'],
            'use_coupon' => $_POST['use_coupon'],
            'buyer_id' => $_POST['buyer_id'],
            'notify_id' => $_POST['notify_id'],
            'price' => $_POST['price'],
            'sign_type' => $_POST['sign_type'],
            'sign' => $_POST['sign'],
            'gmt_payment' => $_POST['gmt_payment']
        );

        $result = apiCall(AlipayNotifyApi::ADD,array($entity));
        if(!$result['status']){
            LogRecord($result['info'],__FILE__.__LINE__);
        }

    }

}